﻿using System;
using System.Drawing;
using System.Windows.Forms;

namespace CloudDetector.GUI
{
    /// <summary>
    /// Hisztogram megjelenítő ablak osztály
    /// </summary>
    public partial class HistogramDialog : Form
    {
        #region Fields

        private int[,] pHistogram;
        private int mLayerNumber;
        private int pSelectedLayer;

        #endregion

        #region Properties

        /// <summary>
        /// Megjelenített hisztogram lekérése vagy beállítása.
        /// </summary>
        public int[,] Histogram
        {
            get 
            {
                if (pSelectedLayer != 6)
                {
                    return pHistogram;
                }
                return null;
            }
            set
            {
                pHistogram = value;
                PaintHistogram();
            }
        }

        /// <summary>
        /// Megjelenített réteg hisztogramjának száma
        /// </summary>
        public int SelectedLayer
        {
            get { return pSelectedLayer; }
            private set { pSelectedLayer = value; }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// Hisztogram megjelenítő.
        /// </summary>
        /// <param name="histo">Megjelenítendő hisztogramok tömbje.</param>
        public HistogramDialog(int[,] histo)
        {
            InitializeComponent();

            Histogram = histo;
            mLayerNumber = 6;
            pSelectedLayer = 0;
        }

        #endregion

        #region Member Methods

        /// <summary>
        /// Hisztogramokat kirajzoló metódus.
        /// </summary>
        private void PaintHistogram()
        {
            Graphics gr = histogramPanel.CreateGraphics();
            // hátteret szürkére festjük
            gr.FillRectangle(Brushes.Gray, 0, 0, histogramPanel.Width, histogramPanel.Height);
            Brush brush = Brushes.Blue;
            int max = 0;

            if (!allRadioButton.Checked)
            {
                //max érték keresés
                for (int i = 0; i < 256; i++)
                {
                    if (max < pHistogram[pSelectedLayer, i])
                        max = pHistogram[pSelectedLayer, i];
                }
                // intenzitás értékek rajzolása
                for (int i = 0; i < 256; i++)
                {
                    gr.FillRectangle(brush, 2 * i, histogramPanel.Height - pHistogram[pSelectedLayer, i] * histogramPanel.Height / max, 2, histogramPanel.Height);
                }
            }
            else // ha minden sávot ki akarunk rajzolni
            {
                //max érték keresés
                for (int k = 0; k < mLayerNumber; k++)
                {
                    for (int i = 0; i < 256; i++)
                    {
                        if (max < pHistogram[k, i])
                            max = pHistogram[k, i];
                    }                    
                }
                // intenzitás értékek rajzolása
                for (int i = 0; i < 256; i++)
                {
                    for (int k = 0; k < mLayerNumber; k++)
                    {
                        gr.FillRectangle(brush, 2 * i, histogramPanel.Height - pHistogram[k, i] * histogramPanel.Height / max, 2, histogramPanel.Height);
                    }
                }
            }
        }

        /// <summary>
        /// Megfelelő layert kiválasztó metódus.
        /// </summary>
        private void SetSelectedLayer()
        {
            // a megfelelő layer kiválasztása
            if (lyr1RadioButton.Checked)
            {
                SelectedLayer = 0;
            }
            else if (lyr2RadioButton.Checked)
            {
                SelectedLayer = 1;
            }
            else if (lyr3RadioButton.Checked)
            {
                SelectedLayer = 2;
            }
            else if (lyr4RadioButton.Checked)
            {
                SelectedLayer = 3;
            }
            else if (lyr5RadioButton.Checked)
            {
                SelectedLayer = 4;
            }
            else if (lyr7RadioButton.Checked)
            {
                SelectedLayer = 5;
            }
            else if (allRadioButton.Checked)
            {
                SelectedLayer = 6;
            }
        }

        #endregion

        #region Event Handlers

        private void Radio_CheckedChanged(object sender, EventArgs e)
        {
            SetSelectedLayer();
            PaintHistogram();
        }

        private void HistogramDialog_Load(object sender, EventArgs e)
        {
            allRadioButton.Checked = true;
        }

        private void HistogramPanel_Paint(object sender, PaintEventArgs e)
        {
            PaintHistogram();
        }

        #endregion
    }
}
